gsk: Add gsk_color_node_new()
authorBenjamin Otte <otte@redhat.com>
Tue, 13 Dec 2016 02:35:56 +0000 (03:35 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 17:01:10 +0000 (18:01 +0100)
docs/reference/gsk/gsk4-sections.txt
gsk/gskenums.h
gsk/gskrendernode.h
gsk/gskrendernodeimpl.c
gsk/gskrendernodeprivate.h
gtk/inspector/gtktreemodelrendernode.c

index 8e6239d427a66ef3233afcb526f6d0994d29b9c0..6126c4f4feb01b1870efa37565be6300d8a7bb37 100644 (file)
@@ -35,6 +35,7 @@ gsk_render_node_set_blend_mode
 GskScalingFilter
 gsk_render_node_set_scaling_filters
 gsk_render_node_set_name
+gsk_color_node_new
 gsk_texture_node_new
 gsk_cairo_node_new
 gsk_cairo_node_get_draw_context
index 26ce47ff929019d77929d287515a840de2d77846..579e3d9c502084165acdf9cd6440f1c8ad0fea22 100644 (file)
@@ -27,6 +27,7 @@
  * @GSK_NOT_A_RENDER_NODE: Error type. No node will ever have this type.
  * @GSK_CONTAINER_NODE: A node containing a stack of children
  * @GSK_CAIRO_NODE: A node drawing a #cairo_surface_t
+ * @GSK_COLOR_NODE: A node drawing a single color rectangle
  * @GSK_TEXTURE_NODE: A node drawing a #GskTexture
  * @GSK_TRANSFORM_NODE: A node that renders its child after applying a
  *     matrix transform
@@ -39,6 +40,7 @@ typedef enum {
   GSK_NOT_A_RENDER_NODE = 0,
   GSK_CONTAINER_NODE,
   GSK_CAIRO_NODE,
+  GSK_COLOR_NODE,
   GSK_TEXTURE_NODE,
   GSK_TRANSFORM_NODE
 } GskRenderNodeType;
index c874cb5b2e84ff88b45f5cfe24a010bef88788b0..2119dfb7600a7d7e13bb676df5365bfb07057faf 100644 (file)
@@ -44,6 +44,10 @@ void                    gsk_render_node_unref                   (GskRenderNode *
 GDK_AVAILABLE_IN_3_90
 GskRenderNodeType       gsk_render_node_get_node_type           (GskRenderNode *node);
 
+GDK_AVAILABLE_IN_3_90
+GskRenderNode *         gsk_color_node_new                      (const GdkRGBA            *rgba,
+                                                                 const graphene_rect_t    *bounds);
+
 GDK_AVAILABLE_IN_3_90
 GskRenderNode *         gsk_texture_node_new                    (GskTexture               *texture,
                                                                  const graphene_rect_t    *bounds);
index b80c0f6aeeb282dcb25bb4c8c93251768afd986d..feb7f0891c9ab253e743a499976c7865f54cc978 100644 (file)
 #include "gskrendererprivate.h"
 #include "gsktextureprivate.h"
 
+/*** GSK_COLOR_NODE ***/
+
+typedef struct _GskColorNode GskColorNode;
+
+struct _GskColorNode
+{
+  GskRenderNode render_node;
+
+  GdkRGBA color;
+  graphene_rect_t bounds;
+};
+
+static void
+gsk_color_node_finalize (GskRenderNode *node)
+{
+}
+
+static void
+gsk_color_node_make_immutable (GskRenderNode *node)
+{
+}
+
+static void
+gsk_color_node_draw (GskRenderNode *node,
+                     cairo_t       *cr)
+{
+  GskColorNode *self = (GskColorNode *) node;
+
+  gdk_cairo_set_source_rgba (cr, &self->color);
+
+  cairo_rectangle (cr,
+                   self->bounds.origin.x, self->bounds.origin.y,
+                   self->bounds.size.width, self->bounds.size.height);
+  cairo_fill (cr);
+}
+
+static void
+gsk_color_node_get_bounds (GskRenderNode   *node,
+                           graphene_rect_t *bounds)
+{
+  GskColorNode *self = (GskColorNode *) node;
+
+  graphene_rect_init_from_rect (bounds, &self->bounds); 
+}
+
+static const GskRenderNodeClass GSK_COLOR_NODE_CLASS = {
+  GSK_COLOR_NODE,
+  sizeof (GskColorNode),
+  "GskColorNode",
+  gsk_color_node_finalize,
+  gsk_color_node_make_immutable,
+  gsk_color_node_draw,
+  gsk_color_node_get_bounds
+};
+
+const GdkRGBA *
+gsk_color_node_peek_color (GskRenderNode *node)
+{
+  GskColorNode *self = (GskColorNode *) node;
+
+  return &self->color;
+}
+
+/**
+ * gsk_color_node_new:
+ * @color: the #GskColor
+ * @bounds: the rectangle to render the color into
+ *
+ * Creates a #GskRenderNode that will render the given
+ * @color into the area given by @bounds.
+ *
+ * Returns: A new #GskRenderNode
+ *
+ * Since: 3.90
+ */
+GskRenderNode *
+gsk_color_node_new (const GdkRGBA         *rgba,
+                    const graphene_rect_t *bounds)
+{
+  GskColorNode *self;
+
+  g_return_val_if_fail (rgba != NULL, NULL);
+  g_return_val_if_fail (bounds != NULL, NULL);
+
+  self = (GskColorNode *) gsk_render_node_new (&GSK_COLOR_NODE_CLASS);
+
+  self->color = *rgba;
+  graphene_rect_init_from_rect (&self->bounds, bounds);
+
+  return &self->render_node;
+}
+
 /*** GSK_TEXTURE_NODE ***/
 
 typedef struct _GskTextureNode GskTextureNode;
index 239e64dc70719d703f4b855a9028bf88e1b164a4..c4e3c48751962c9c463c86ba260aa4bf6ecd7f6d 100644 (file)
@@ -58,6 +58,8 @@ cairo_surface_t *gsk_cairo_node_get_surface (GskRenderNode *node);
 
 GskTexture *gsk_texture_node_get_texture (GskRenderNode *node);
 
+const GdkRGBA *gsk_color_node_peek_color (GskRenderNode *node);
+
 void gsk_transform_node_get_transform (GskRenderNode *node, graphene_matrix_t *transform);
 
 GskBlendMode gsk_render_node_get_blend_mode (GskRenderNode *node);
index 8bfbfe28553eaca1c9590b784b1785b25f115694..617b4b7f7825ffd743d58c82d4e04411d19b91d1 100644 (file)
@@ -522,6 +522,7 @@ append_node (GtkTreeModelRenderNode *nodemodel,
 
     case GSK_CAIRO_NODE:
     case GSK_TEXTURE_NODE:
+    case GSK_COLOR_NODE:
       /* no children */
       break;